#include "Int_OLED.h"

/** 清屏幕 */
code u8 data_array[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

/**
 * @brief 初始化数据
 *
 */
void Int_OLED_Init(u8 *array, u8 lenth, bit is_data)
{
    u8 ack;
    u8 i;
    // 准备开始
    Dri_I2c_Start();
    // 发送地址
    Dri_I2c_SendByte(OLED_ADDER_W);
    ack |= Dri_I2c_Receive_Ask();
    // 发送控制字节
    // 1. Co = 0 连续,, D/C# 写入数据还是命令
    if (is_data == 1) {
        Dri_I2c_SendByte(0x40);
    } else {
        Dri_I2c_SendByte(0X00);
    }
    ack |= Dri_I2c_Receive_Ask();

    // 批量发送数据
    for (i = 0; i < lenth; i++) {
        Dri_I2c_SendByte(array[i]);
        ack |= Dri_I2c_Receive_Ask();
    }

    Dri_I2c_Stop();
}

/**
 * @brief 发送数据初始化
 *
 */
void Int_OLED_Start()
{
    // 定义存放命令的数组
    u8 cmds[6];

    // 关闭OELD显示
    cmds[0] = 0xAE;

    // Common 、Segment 重映射
    cmds[1] = 0xA1;
    cmds[2] = 0xC8;

    // 电荷泵设置
    cmds[3] = 0x8D;
    cmds[4] = 0x14;

    // 打开OLED显示
    cmds[5] = 0xAF;
    Int_OLED_SendCommand(cmds, 6);
}

/**
 * @brief 发送数据
 *
 * @param dataArray 数据数组
 * @param lenth 数据长度
 */
void Int_OLED_SendData(u8 *dataArray, u8 lenth)
{
    Int_OLED_Init(dataArray, lenth, 1);
}

/**
 * @brief 发送命令
 *
 * @param dataArray 命令数组
 * @param lenth 命令长度
 */
void Int_OLED_SendCommand(u8 *commandArray, u8 lenth)
{
    Int_OLED_Init(commandArray, lenth, 0);
}

/**
 * @brief 清空,黑屏
 */
void Int_OLED_Clear()
{
    u8 i;
    //  添加命令
    u8 command_array[2];
    // u8 data_array[16] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  
    // 写入方式: 水平
    command_array[0] = 0X20;
    command_array[1] = 0X00;
    // // 写入方式,设置页地址范围:默认(开始到结束)
    // command_array[2] = 0X22;
    // // 写入方式,设置列地址范围:默认(0-127)全部
    // command_array[3] = 0X21;

    Int_OLED_SendCommand(command_array, 2);

    // Int_OLED_SendCommand(command_array, 4);
    // 展示数据
    for (i = 0; i < 64; i++) {
        Int_OLED_SendData(data_array, 16);
    }
}